package com.tree.leetcode.string;

import com.tree.array.ArrayList;

import java.util.List;

/**
 * @ClassName com.tree.leetcode.string
 * Description: 151. 翻转字符串里的单词
 * <p>
 * 给定一个字符串，逐个翻转字符串中的每个单词。
 *
 *  
 *
 * 示例 1：
 *
 * 输入: "the sky is blue"
 * 输出: "blue is sky the"
 * 示例 2：
 *
 * 输入: "  hello world!  "
 * 输出: "world! hello"
 * 解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
 * 示例 3：
 *
 * 输入: "a good   example"
 * 输出: "example good a"
 * 解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 *  
 *
 * 说明：
 *
 * 无空格字符构成一个单词。
 * 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
 * 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 *  
 *
 * 进阶：
 *
 * 请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-words-in-a-string
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * </p>
 * @Author tree
 * @Date 2020-03-08 23:31
 * @Version 1.0
 */
public class ReverseWords_151 {
    public static void main(String[] args) {
//        String s = "  hello world!  ";
//        String s = "the sky is blue";
        String s = "   a   b  c d   e  ";

        System.out.println("原始字符串："+s);
        System.out.println("翻转后字符串："+reverseWords(s));

    }

    /**
     * 思想：
     * 第一个与最后一个交换， 第二个与（最后一个-1）交换， 依次内推
     * @param s
     * @return
     */
    public static String reverseWords(String s) {
        String[] arr = s.split(" ");


        Object v = "";

        Object[] newStr = replaceSpaceStr(arr).toArray();
        int start = 0;
        int end = newStr.length -1;
        for(int i = 0; i< newStr.length;i++){
            v = newStr[i];
            if("".equals(v)){
                continue;
            }
            if(start == end || start > end){
                break;
            }
            swap(newStr,start ,end);
            start++;
            end--;
        }
        ;

        return printArr( newStr);
    }

    private static List replaceSpaceStr(Object[] str) {
        List list = new ArrayList();
        for (int i = 0; i <str.length; i++) {
            if(!"".equals(str[i])) {
                list.add(str[i]);
            }

        }
        return list;
    }

    private static String printArr(Object[] arr) {
        StringBuilder sb = new StringBuilder(1024);
        Object v = "";
        int len =  arr.length;
        for (int i = 0; i < len; i++) {
            v = arr[i];
            if("".equals(v)){
                continue;
            }
            sb.append(v);
            if(i != (len-1) ){
                sb.append(" ");
            }

        }

        if(sb.length() == sb.lastIndexOf(" ")){
            return sb.substring(0,sb.lastIndexOf(" "));
        }
        return sb.toString();

    }


    private static void swap(Object[] str,int start, int end) {
        Object tmp = str[start];
        str[start] = str[end];
        str[end] = tmp;

    }
}
